// 路由前置守卫
// 进行登录拦截的控制
import router from '@/router'
import store from '@/store'
import NProgress from 'nprogress' // 页面进度条
import { asyncRouter, constantRoutes } from '@/router'

// 白名单（不需要认证的）
const whiteList = ['/login', '/404'] // no redirect whitelist
// 路由前置守卫
// 所有的路由在真正被访问到之前，都会先经过全局前置路由守卫,只有守卫放行了才能看到真正的页面
router.beforeEach(async(to, _from, next) => {
  NProgress.start()
  // 获取用户权限
  // 登录是第三方登录  如果这边获取到了值说明是已经登录过了的
  const userInfo = store.getters.userInfo
  // 判断 如果登录过了 去的是登录页面 直接给用户跳转到首页，否则的话直接让用户直接访问
  if (userInfo) {
    if (to.path === '/login') {
      next('/dashboard')
      NProgress.done()
    } else {
      next()
    }
  } else {
    // 用户没有登录，判断用户去的页面是否在白名单里面，如果在白名单直接通过
    if (whiteList.includes(to.path)) {
      next()
    } else {
      // 用户去的地方页面不在白名单，发送请求获取用户的路由
      store.dispatch('user/getUserInfo').then(async res => {
        if (res.code === '0000') {
          // 把本地路由合并存储到sessionStorage中，方便给觉得分配菜单使用
          const allRoute = [...constantRoutes, ...asyncRouter]
          // sessionStorage.setItem('this_locality_route', JSON.stringify(allRoute))

          // 存储在vuex中 用于左侧栏更新左侧栏的获取，
          // 左侧栏的数据来源于路由
          // otherRoutes 根据后端返回值修改菜单名称
          const permissionList = JSON.parse(res.data).permissionList
          console.info(permissionList)
          const otherRoutes = await store.dispatch('permission/filterRoutes', permissionList)
          sessionStorage.setItem('this_locality_route', JSON.stringify(otherRoutes))

          // console.log(otherRoutes, 'otherRoutes')

          // 过滤出没有权限的菜单 删除本地路由
          // const newOtherRoutes = await store.dispatch('permission/newOtherRoutes', otherRoutes)
          // 动态修改路由
          router.addRoutes([...otherRoutes, { path: '*', redirect: '/404', hidden: true }])
          next({
            ...to,
            replace: true // 避免重新进入后，出现重复页的历史记录
          })
          return
        }
        next()
      }).catch(error => {
        if (error.code === '2002') {
          sessionStorage.removeItem('this_locality_route')
          next('/login')
        }
      })
    }
  }
})

// 路由后置守卫
router.afterEach(() => {
  // finish progress bar
  NProgress.done()
})
